package cn.blnp.net.flowable.event.base.other;

import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.RuntimeService;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * <h3>其它流程事件说明</h3>
 *
 * @author <a href="mailto:blnp.yibin@qq.com">lyb</a>
 * @version 1.0
 * @since 2025/5/7 9:46
 */
@Slf4j
@SpringBootTest
public class EventDefTest {

    @Resource
    private RuntimeService runtimeService;


    /**
     *  <h3>错误事件定义</h3>
     *  <hr/>
     *  <p>
     *   &emsp;&emsp;BPMN错误与Java异常没有直接关联。BPMN错误事件主要用于表示流程中出现的业务异常。例如，在财务审计流程中，有一个环节是审计财务状况是否正常，如果发现财务状况异常，
     *   则触发事先定义好的错误事件，进入特定的处理流程。
     *  </p>
     *  <p>
     *   &emsp;&emsp;BPMN错误使用error元素定义，被声明为流程定义definitions根元素的子元素，其属性包含id、name和errorCode，其中id属性值不允许为空。在处理业务时抛出相应的异常代码，
     *   工作流引擎会根据该异常代码匹配对应的错误事件（errorCode跟异常代码相同）。如果errorCode属性为空，则表示可以匹配所有错误事件。错误事件使用errorEventDefinition元素定义，通过
     *   其errorRef属性引用一个BPMN错误（其值为error元素的id）。
     *  </p>
     *  <p>
     *   &emsp;&emsp;错误事件可以嵌入开始事件、边界事件和结束事件，从而构成错误开始事件、错误边界事件和错误结束事件。错误事件只会出现在流程的以下位置：
     *  </p>
     *  <ul>
     *      <li>活动（如任务、子流程）边界上，以错误边界事件的形式出现；</li>
     *      <li>流程结束处，以错误结束事件的形式出现；</li>
     *      <li>子流程开始处，以错误开始事件的形式出现。</li>
     *  </ul>
     **/

    @Test
    public void test() {

    }

    /**
     *  <h3>取消事件定义</h3>
     *  <p>
     *      在BPMN 2.0规范中，取消事件通常搭配事务子流程使用。取消事件可以嵌入边界事件和结束事件，构成取消边界事件和取消结束事件。取消事件使用cancelEventDefinition元素定义。
     *  </p><br/>
     *
     *  <h3>补偿事件定义</h3>
     *  <p>
     *      当一个流程操作完成后，其结果可能不符合预期，这时可以使用补偿机制对已经成功完成的流程操作进行补偿处理。补偿事件主要用于触发补偿机制。Flowable目前支持将补偿事件嵌入边界事
     *      件和中间抛出事件，构成补偿边界事件和补偿中间抛出事件。补偿事件使用compensateEventDefinition元素定义。
     *  </p><br/>
     *
     *  <h3>终止事件定义</h3>
     *  <p>
     *      终止事件搭配结束事件使用，构成终止结束事件，主要用于终止流程或子流程。如果在流程实例中使用它，则整个流程会被终止；如果在子流程中使用它，则该子流程会被终止。终止事件
     *      使用terminateEventDefinition元素定义。
     *  </p>
     **/

    @Test
    public void test1() {

    }

    /**
     *  <h3>升级事件定义</h3>
     *  <p>
     *      升级事件是一种引用了升级的事件。升级事件是<b>用于子流程给主流程，或子流程与其平级的子流程之间传递信息的事件</b>。升级事件可以嵌入开始事件、边界事件、中间抛出事件和结束事件，
     *   从而组成升级开始事件、升级边界事件、升级中间抛出事件和升级结束事件。升级事件与错误事件不同，它会从抛出的位置继续执行。如果没有捕获器捕获对应的升级事件，则该事件不会被处理。
     *  </p>
     *  <p>
     *      升级使用escalation元素定义，被声明为流程定义definitions根元素的子元素。其属性包含id、name和escalationCode，其中，id、escalationCode属性值不允许为空。升级事件使
     *   用escalationEventDefinition元素定义，通过其escalationRef属性引用一个升级（其值为escalation元素的id）。以定义升级开始事件为例：
     *  </p>
     *  <pre>
     *      {@code
     *          <!-- 定义升级 -->
     *          <escalation id="theEscalation" name="测试升级" escalationCode="theEscalationCode"/>
     *          <process id="escalationProcess">
     *              <!-- 定义升级开始事件 -->
     *              <startEvent id="escalationStartEvent" name="测试升级开始事件" isInterrupting="true">
     *                  <escalationEventDefinition escalationRef="theEscalation"/>
     *              </startEvent>
     *              <!-- 其他元素省略 -->
     *          </process>
     *      }
     *  </pre>
     **/

    @Test
    public void test2() {

    }

    /**
     *  <h3>条件事件定义</h3>
     *  <p>
     *      条件事件是一种等待事件，只有在给定条件被求值为true时才会触发。它可以嵌入开始事件、边界事件和中间捕获事件。条件事件只能是捕获事件。
     *   条件事件由conditionalEventDefinition元素定义，它必须包含一个condition子元素用于判定条件事件是否触发。示例代码如下：
     *  </p>
     *  <pre>
     *      {@code
     *          <conditionalEventDefinition>
     *              <condition type="tFormalExpression">${num > 10}</condition>
     *          </conditionalEventDefinition>
     *      }
     *  </pre>
     **/
    @Test
    public void test3() {
        //执行API 进行评估检查
        runtimeService.evaluateConditionalEvents("");
        runtimeService.evaluateConditionalEvents("", null);
    }

    /**
     *  <h3>变量监听器事件定义</h3>
     *  <p>
     *      变量监听器事件指由流程变量变化所触发的事件，可以嵌入开始事件、边界事件和中间捕获事件。变量监听器事件作为扩展属性存在于这些事件的extensionElements下，
     *   通过flowable:variableListenerEventDefinition元素定义，包含variableName和variableChangeType属性。以定义变量监听器事件为例：
     *  </p>
     *  <pre>
     *      {@code
     *          <startEvent id="variableListenerStartEvent" isInterrupting="true">
     *              <extensionElements>
     *                  <flowable:variableListenerEventDefinition variableName="totalNum" variableChangeType="createupdate"/>
     *              </extensionElements>
     *          </startEvent>
     *      }
     *  </pre>
     *  <p>
     *      variableChangeType 的可取值有以下几个：
     *  </p>
     *  <ol>
     *      <li>create</li>
     *      <li>update</li>
     *      <li>createupdate</li>
     *      <li>all</li>
     *  </ol>
     **/
    @Test
    public void test4() {

    }
}
